package classe.grafica;

import classes.adjuntas.AuxiliarContatos;                                       //Importação da classe auxiliar para gerenciar os contatos
import classes.gerais.Contato;                                                  //Importação da classe de contatos
import classes.gerais.Favorito;                                                 //Importação da classe de favoritos
import java.util.ArrayList;                                                     //Importação da classe de arrays lists
import javax.swing.DefaultListModel;                                            //Importação de um modelo para as listas (componente)
import javax.swing.JOptionPane;                                                 //Importação da classe para mostrar as mensagens
import javax.swing.ListSelectionModel;                                          //Importação para reaver seleção de uma lista (componente)                                          

public class Favoritos extends javax.swing.JFrame {                             //Classe Favoritos - extende uma JFrame

    private ArrayList<Favorito> Favoritos;                                      //Favoritos - Array list feito para guardar uma sequencia de favoritos
    private DefaultListModel Modelo;                                            //Modelo - cria um modelo para a lista (componente)
    private AuxiliarContatos Suporte;                                           //Suporte - suporte para gerenciar os contatos
    
    public Favoritos() {                                                        //Montador que inicializa os elementos da classe favoritos
        initComponents();                                                       //Inicia os componentes
        this.Favoritos = new ArrayList();                                       //Inicia um novo array list de favoritos
        this.Modelo = new DefaultListModel();                                   //Inicia o modelo da lista (componente)
        this.Suporte = new AuxiliarContatos();                                  //Inicia o suporte
   
        ListFFavoritos.setModel(Modelo);                                        //Insere o modelo na lista
        ListFFavoritos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);   //Só é possível selecionar um elemento
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        SPFFavoritos = new javax.swing.JScrollPane();
        ListFFavoritos = new javax.swing.JList();
        BFChat = new javax.swing.JButton();
        BFExcluir = new javax.swing.JButton();
        BFInserir = new javax.swing.JButton();
        LFFavoritos = new javax.swing.JLabel();
        BFMensagem = new javax.swing.JButton();

        setTitle("CER - Favoritos");

        SPFFavoritos.setViewportView(ListFFavoritos);

        BFChat.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        BFChat.setIcon(new javax.swing.ImageIcon(getClass().getResource("/classe/grafica/iChat.png"))); // NOI18N
        BFChat.setText("Chat");
        BFChat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BFChatActionPerformed(evt);
            }
        });

        BFExcluir.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        BFExcluir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/classe/grafica/minus white.png"))); // NOI18N
        BFExcluir.setText("Excluir");
        BFExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BFExcluirActionPerformed(evt);
            }
        });

        BFInserir.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        BFInserir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/classe/grafica/plus.png"))); // NOI18N
        BFInserir.setText("Inserir");
        BFInserir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BFInserirActionPerformed(evt);
            }
        });

        LFFavoritos.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        LFFavoritos.setText("Favoritos");

        BFMensagem.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        BFMensagem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/classe/grafica/splash green.png"))); // NOI18N
        BFMensagem.setText("Mensagem");
        BFMensagem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BFMensagemActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(SPFFavoritos, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(BFExcluir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(BFChat, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(BFInserir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(BFMensagem, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(18, 18, 18))
            .addGroup(layout.createSequentialGroup()
                .addGap(63, 63, 63)
                .addComponent(LFFavoritos)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(LFFavoritos)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(BFInserir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(BFExcluir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(BFMensagem)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(BFChat, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(SPFFavoritos))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void BFInserirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BFInserirActionPerformed
        String Nome, IP, Porta, Mensagem;                                       //Componentes dos favoritos
        Nome = null;                                                            //Inicializa null
        IP = null;                                                              //Inicializa null
        Porta = null;                                                           //Inicializa null
        Mensagem = null;                                                        //Inicializa null

        ArrayList<Contato> Contatos = Suporte.DevolveSuperClasse(Favoritos);                                                                        //Pede a superclasse dos favoritos para a verificação
        Nome = (String) JOptionPane.showInputDialog("Digite o Nome:");                                                                              //Cria janela to pedindo o nome
        while (Suporte.VerificarNome(Nome, Contatos)==false) Nome = (String) JOptionPane.showInputDialog("(Nome já esxistente) Digite o Nome:");    //Verifica se o nome já existe na lista
        if (Nome != null){                                                                                                                          //Se o nome existir       
            IP = (String)JOptionPane.showInputDialog("Digite o IP (###.###.#.##):");                                                                //Pede um IP relacionado
            if (IP != null){                                                                                                                        //Se o IP existir
                Porta = (String)JOptionPane.showInputDialog("Digite a porta de acesso(1025 a 1029):");                                              //Pede uma porta relacionada
                if (Porta != null){                                                                                                                 //Se a porta existir
                    Porta = Suporte.GerenciaPorta(Porta, 1025, 1029, Contatos);                                                                     //Chama o gerenciador de portas para analisá-lo
                    if (Porta != null){                                                                                                             //Se a porta existir
                        Mensagem = (String) JOptionPane.showInputDialog("Digite a mensagem para o favorito:");                                      //Pede uma mensagem para o favorito
                        Favorito Novo = new Favorito (Nome, IP, Integer.parseInt(Porta), Mensagem);                                                 //Cria o favorito
                        Favoritos.add(Novo);                                                                                                        //Adiciona o favorito no array list
                        Modelo.addElement(Nome);                                                                                                    //Adiciona o nome do favorito na lista (componente)
                    }
                }
            }
        }     
    }//GEN-LAST:event_BFInserirActionPerformed

    private void BFExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BFExcluirActionPerformed
      String Deletar;                                                           //String que guardará o elemento a ser deletado
        
        Deletar = (String) ListFFavoritos.getSelectedValue();                   //Recebe o elemento da lista (componente) de favoritos, o dado será encontrado pelo nome
      
        for (Favorito Busca : Favoritos){                                       //Para cada favorito no array list de favoritos
            if (Busca.DevolveNome().equals(Deletar)){                           //Se o elemento for o buscado
                Suporte.RemoverChat(Busca);                                     //Remove a janela de chat
                Favoritos.remove(Busca);                                        //Remove o favorito
                break;                                                          //Para o laço
            }
        }
        
        Modelo.removeElement(Deletar);                                          //Remove da lista (componente)
    }//GEN-LAST:event_BFExcluirActionPerformed

    private void BFChatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BFChatActionPerformed
      String Elemento;                                                          //Guardará o elemento que se vai começar a conexão
      Contato Busca = null;                                                     //Contato que se irá começar a conexão
      Chat TelaChat;                                                            //Tela que será usada para a conexão
      
      Elemento = (String) ListFFavoritos.getSelectedValue();                    //Recebe o elemento selecionado na lista (componente)
      
      if (Elemento != null){                                                    //Se o elemento existir
      for (Contato BuscaL : Favoritos){                                         //Para cada favorito no array list de favoritos
            if (BuscaL.DevolveNome().equals(Elemento)){                         //Se for o elemento buscado
                Busca = BuscaL;                                                 //Referencia esse elemento fora do laço
                break;                                                          //Para o laço
            }
        }
      
      try {                                                                     //Tente executar
        TelaChat = Suporte.ExistenciaContatoChat(Busca);                        //Verifica se já uma conexão aberta com esse usuário
        if (TelaChat != null){                                                  //Se existir...
            TelaChat.setVisible(true);                                          //Tornea-a visível
        }
        else {                                                                  //Se não...
            TelaChat = new Chat(Busca);                                         //Cria uma janela de chat
            Suporte.InserirChat(TelaChat);                                      //Guarda a janela de chat
            TelaChat.setLocationRelativeTo(null);                               //Centraliza a janela
            TelaChat.show();                                                    //Mostra a janela
        }
      }
      catch (Exception e){                                                      //Caso ocorra uma excessão
          System.out.println("Contato não encontrado!!");                         //Notifica
      }
      }
    }//GEN-LAST:event_BFChatActionPerformed

    private void BFMensagemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BFMensagemActionPerformed
      String Elemento;                                                          //Elemento que se busca a mensagem
        
      Elemento = (String) ListFFavoritos.getSelectedValue();                    //Recebe o elemento
      
      for (Favorito BuscaL : Favoritos){                                        //Para cada favorito existente em favoritos
            if (BuscaL.DevolveNome().equals(Elemento)){                         //Se o favorito for o buscado
                JOptionPane.showMessageDialog(null,BuscaL.DevolveDescricao());  //Mostra a mensagem referente a ele
                break;                                                          //Para o laço
            }
        }
    }//GEN-LAST:event_BFMensagemActionPerformed


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton BFChat;
    private javax.swing.JButton BFExcluir;
    private javax.swing.JButton BFInserir;
    private javax.swing.JButton BFMensagem;
    private javax.swing.JLabel LFFavoritos;
    private javax.swing.JList ListFFavoritos;
    private javax.swing.JScrollPane SPFFavoritos;
    // End of variables declaration//GEN-END:variables
}
